﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LibNiconico.NiconicoApi.Utils
{
    /// <summary>
    /// ニコニコチャット送信結果コード
    /// </summary>
    public enum NicoChatResultStatusCode
    {
        /// <summary>
        /// 設定されていない
        /// </summary>
        None,

        /// <summary>
        /// 成功
        /// </summary>
        Succeed,

        /// <summary>
        /// 失敗
        /// </summary>
        Failed,

        /// <summary>
        /// スレッド関連のエラー
        /// </summary>
        ThreadError,

        /// <summary>
        /// チケット関連のエラー
        /// </summary>
        TicketError,

        /// <summary>
        /// ポストキー不正
        /// </summary>
        PostKeyError,

        /// <summary>
        /// ロックされている
        /// </summary>
        Locked,

        /// <summary>
        /// 未定義のエラー
        /// </summary>
        Undefined,

    }

    /// <summary>
    /// ニコニコチャット送信結果
    /// </summary>
    public class NicoChatResultStatus
    {

        internal NicoChatResultStatus(NicoChatResultStatusCode code, int baseCode)
        {
            this.Code = code;
            this.baseCode = baseCode;
        }

        /// <summary>
        /// 結果コード
        /// </summary>
        public NicoChatResultStatusCode Code { get; private set; }


        /// <summary>
        /// ステータスが成功か判定
        /// </summary>
        public bool Succeed
        {
            get
            {
                return NicoChatResultStatusCode.Succeed == Code;
            }
        }

        private int baseCode;

        /// <summary>
        /// APIから返されたコードを取得
        /// </summary>
        /// <returns></returns>
        public int GetBaseCode()
        {
            return baseCode;
        }


        internal static NicoChatResultStatus Create(int baseCode)
        {
            switch (baseCode)
            {
                case 0:
                    return new NicoChatResultStatus(NicoChatResultStatusCode.Succeed, baseCode);
                    
                case 1:
                    return new NicoChatResultStatus(NicoChatResultStatusCode.Failed, baseCode);


                case 2:
                    return new NicoChatResultStatus(NicoChatResultStatusCode.ThreadError, baseCode);

                case 3:
                    return new NicoChatResultStatus(NicoChatResultStatusCode.TicketError, baseCode);

                case 4:
                case 8:
                    return new NicoChatResultStatus(NicoChatResultStatusCode.PostKeyError, baseCode);

                case 5:
                    return new NicoChatResultStatus(NicoChatResultStatusCode.Locked, baseCode);

                default:
                    return new NicoChatResultStatus(NicoChatResultStatusCode.Undefined, baseCode);



            }
        }
    }
}
